const fs = require("fs");
// 发布订阅
let events = {
  _arr: [],
  on(fn) {
    this._arr.push(fn);
  },
  emit(...args) {
    this._arr.forEach(fn => fn(...args))
  }
}

let obj = {}
events.on(function (key, value) {
  console.log(key, value);
  obj[key] = value;
})

events.on(function () {
  if (Object.keys(obj).length === 2) {
    console.log(obj);
  }
})

// 读取文件都采用绝对路径，相对路径会参考你执行文件的路径
fs.readFile('./a.txt', 'utf8', function (err, data) {
  events.emit('a', data);
})

fs.readFile('./b.txt', 'utf8', function (err, data) {
  events.emit('b', data);
})

// 观察者模式（前后有关联性，内部基于发布订阅）     发布订阅（发布和订阅之间没有关系，没订阅也能发布）